package zf.display.tools
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.DisplayObject;
	import flash.display.MovieClip;
	import flash.display.Sprite;
	import flash.display.Stage;
	import flash.geom.Matrix;
	import flash.utils.getDefinitionByName;
	
	public class DisplayObjectTool
	{
		/**
		 * 转换字符串末尾的数字，如果数字为多位，依然会转换，但是会去掉首位的0 
		 * @param s 待转字符
		 * @return Number 如果没有将会返回0
		 * 
		 */
		public static function getIndex(s:String):Number
		{
			var numStr:String = "";
			var index:uint = s.length - 1;
			var num:Number = s.charCodeAt(index);
			while (num>=48 && num<=57)
			{
				numStr = s.charAt(index) + numStr;				
				index--;
				num = s.charCodeAt(index);
			}
			return Number(numStr);
		}
		
		/**
		 * 获得显示对象名字末尾的数字，如果数字为多位，依然会转换，但是会去掉首位的0 
		 * @param dp 显示对象
		 * @return Number 如果没有将会返回0
		 * 
		 */
		public static function getDisplayObjectIndex(dp:Object):Number
		{
			var s:String=dp.toString();
			if(isNumber(s)==false)
			{
				s=dp.name;
				if(isNumber(s)==false)
				{
					throw new Error("This object does not contain Numbers.");
				}
			}			
			return getIndex(s);
		}
		
		/**
		 * 是否数字 
		 * @param s
		 * @return 
		 * 
		 */
		private static function isNumber(s:String):Boolean
		{
			var len:int=s.length;
			var num:Number=s.charCodeAt(len-1);
			if(num>=48 && num<=57)
			{
				return true;
			}
			return false;
		}
		
		/**
		 * 获得一个可显示对象相对于stage的路径
		 * @param dp
		 * @return 
		 * 
		 */
		public static function getDisplayPath(dp:DisplayObject):String
		{
			
			if(dp && dp.parent && dp.stage)
			{
				var s:String=dp.name;
				var pdp:DisplayObject=dp.parent;
				var thisStage:Stage=dp.stage;
				while(pdp && pdp!=thisStage)
				{
					s=pdp.name+"."+s;
					pdp=pdp.parent;
				}
				return s;
			}
			return "";
		}
		/**
		 * 获得库中链接名为name的显示对象实例,注意用在载入SWF中可能会失败   
		 * @param name 库中链接的名字
		 * @return DisplayObject
		 * 
		 */
		public static function getLibraryDisplayObject(name:String):DisplayObject
		{
			try
			{
				var obj:Object=getDefinitionByName(name);
			}
			catch(e:Error)
			{
				trace(e);
				return null;
			}
			var nsp:*=new obj();
			if(nsp is BitmapData)
			{
				var bit:Bitmap=new Bitmap(nsp);
				return bit as DisplayObject;
			}
			return nsp as DisplayObject;
		}
		
		/**
		 * 获得库中链接名为name的对象实例,注意用在载入SWF中可能会失败  
		 * @param name 库中链接的名字
		 * @return Object
		 * 
		 */
		public static function getLibraryObject(name:String):Object
		{
			try
			{
				var obj:Object=getDefinitionByName(name);
			}
			catch(e:Error)
			{
				trace(e);
				return null;
			}
			var newObject:Object=new obj();
			return newObject;
		}
		/**
		 * 获得显示对象的截图 
		 * @param obj 显示对象
		 * @param width 生成截图宽  默认为原图宽
		 * @param height 生成截图高  默认为原图高
		 * @return Bitmap图像
		 * 
		 */
		public static function makeBitmap(obj:DisplayObject,width:Number=0,height:Number=0):Bitmap
		{
			// 抓图生成指定大小的bmp
			if(width==0)
			{
				width=obj.width;
			}
			if(height==0)
			{
				height=obj.height;
			}
			var bmpData:BitmapData=new BitmapData(width,height);
			bmpData.draw(obj,new Matrix(width/obj.width,0,0,height/obj.height));
			return new Bitmap(bmpData);
		}
		
		/**
		 * 对显示对象切图，获取某个范围的图片 
		 * @param obj 显示对象
		 * @param width 获取范围宽
		 * @param height 获取范围高
		 * @param x 获取范围起始点X
		 * @param y 获取范围起始点Y
		 * @return Bitmap图像
		 * 
		 */
		public static function inciseBitmap(obj:DisplayObject,width:Number,height:Number,x:Number=0,y:Number=0):Bitmap
		{
			var bmpData:BitmapData=new BitmapData(width,height);
			bmpData.draw(obj,new Matrix(1,0,0,1,-x,-y));
			return new Bitmap(bmpData);
		}
	}
}